const schedule = require('node-schedule');
const config = require('config');
const IMMessage = require('../mongo/im-message');
const moment = require('moment');
const logger = require('flogger').getLogger();
const http = require('http');
const path = require('path');
const fs = require('fs');
var rongCloud = require('rongcloud-sdk');
rongCloud.init(config.RONGCLOUD_APP_KEY, config.RONGCLOUD_APP_SECRET);

try {
  fs.mkdirSync(config.HISTORY_DIR);
} catch (e) {
  logger.debug('创建历史消息目录失败', e.code);
}

// 每半个小时从服务端下载一次消息
module.exports = schedule.scheduleJob('*/30 * * * *', function () {
  // 下载一个小时之前的聊天记录
  let dateString = moment().subtract(1, 'hours').format('YYYYMMDDHH');
  rongCloud.message.history(dateString, 'json', function (err, resultText) {
    if (err) {
      logger.warn(`获取历史消息 ${dateString} 失败`, err);
      return;
    }
    try {
      let result = JSON.parse(resultText);
      if (result.code !== 200) {
        logger.info('返回的 code 不是 200', result);
        return;
      }

      if (!result.url) {
        logger.info(`在 ${dateString} 没有消息记录`);
        return;
      }

      let filename = result.date || dateString;
      download(result.url, path.resolve(config.HISTORY_DIR, filename + '.zip')).then(() => {
        // TODO: 防止消息路由漏消息，从文件导入完整历史消息
      }).catch(err => {
        logger.warn('下载历史消息失败', result, err);
      });

      // 下载
    } catch (e) {
      logger.warn('返回值不是正确的JSON对象', resultText, e);
    }
  });
});

function download(url, dest) {
  return new Promise((resolve, reject) => {
    var file = fs.createWriteStream(dest);
    http.get(url, function (response) {
      response.pipe(file);
      file.on('finish', () => {
        file.close(err => {
          if (err) {
            return reject(err);
          }
          resolve();
        });
      });
    });
  });
}
